# 生成器函数与yield关键字

'''
yield关键字
    + yield 和函数中的return 有点像
    + 共同点:执行到这个关键字后会把结果返回
    + 不同点:
        return 会把结果返回，并结束当前函数的调用
        yield 会返回结果，并记住当前代码执行的位置，下一次调用时会从上一次离开的位置继续向下执行
'''

# 普通函数
# return在函数中会把结果返回，井且结束当前的函数，后面的代码不再执行
def hello():
    print('hello')
    return 1

print(hello())
# hello
# 1

def yhello():
    print('hello')
    yield 3
    print('word')
    yield 4

# 调用生成器函数，返回一个迭代器，操作迭代器的方法就可以了
res = yhello()
# print(next(res))
# hello
# 3
# print(next(res))
# word
# 4

# print(list(res))
# [3, 4]

'''
上面的生成器函数调用时的过程
首先，调用来生成器函数，返回来一个迭代器
1, 第一次去调用选代器
    走到当前的生成器函数中，遇到了yield 3,把 3 返回，井且记住来当前的执行状态(位置)，暂停了执行，等待下次的调用
2, 第二次去调用迭代器
    从上一次遇到的 yield 位置开始执行，遇到了yield 3，把 4 返回，并记住状态，暂停执行， 等待下一次调用
    
如果在最后又调用了迭代器，那么会从上一次的yield位置开始，结果后面没有了，就会超出范围，抛出异常
'''
